四向揮手顧名思義,就是要和TCP連線說byebye了,為什麼要說byebye呢?client需求結束直接斷開不就好了嗎?如果client直接斷開,不和server說,server會認為client還活著,就會綁著connection不放,這樣就造成server的資源浪費。
這裡再複習一下四向揮手的流程
所以接下來也是透過這三個函數_buildEthHeader()
、 _buildIPHeader()
和 _buildTCPHeader(tcp_len, seq, ack_num, flags, window)
來建立header,建議打開https://gist.github.com/kaichiachen/283f1b57e517f9ed558de6c2d15daf62 配合著看
第一步,Client發送ACK和FIN
packet = eth_header + ip_header + _buildTCPHeader(tcp_len=5, seq=self.seq, ack_num=self.ack_num, flags=17, window=29200)
sock.send(packet)
第二步,中途可能會收到來自server的flag==16,也就是ACK,這代表server還有東西還沒送來,直到收到flag==17
,也就是ACK和FIN,代表結束,就回傳ACK
packet = eth_header + ip_header + _buildTCPHeader(tcp_len=5, seq=self.seq, ack_num=self.ack_num, flags=16, window=29200)
sock.send(packet)
接下來明天講如何實驗